package com.jeasonzhao.commons.parser.expression;

public class SyntaxFunctionNode extends SyntaxNode
{
    private SyntaxNodeCollection m_vectParameters = null;
    private String name = null;
    public SyntaxFunctionNode(String functionName,SyntaxNodeCollection nodes)
    {
        this.name = functionName;
        m_vectParameters = nodes;
    }

    public String getExpression()
    {
        StringBuffer buf = new StringBuffer();
        buf.append(this.name);
        buf.append('(');
        for(int n = 0;null != this.m_vectParameters && n < this.m_vectParameters.size();n++)
        {
            buf.append(this.m_vectParameters.get(n).getExpression());
        }
        buf.append(')');
        return buf.toString();
    }

    public void replaceVariableName(INameConvertor map)
    {
        for(int n = 0;null != this.m_vectParameters && n < m_vectParameters.size();n++)
        {
            m_vectParameters.get(n).replaceVariableName(map);
        }

    }

    public ValuePair eval(IEvalProvider provider)
        throws EvalException
    {
        if(null == provider)
        {
            throw new EvalException("Cannot invoking the function without Provider.");
        }
        ValuePair[] params = null == m_vectParameters || m_vectParameters.size() < 1 ? null : new ValuePair[m_vectParameters.size()];
        for(int n = 0;null != m_vectParameters && n < m_vectParameters.size();n++)
        {
            SyntaxNode node = m_vectParameters.elementAt(n);
            params[n] = node.eval(provider);
        }
        return provider.evalFunction(this.name,params);
    }

//    public String getFunctionName()
//    {
//        return null == m_name ? "" : this.m_name.getToken();
//    }

//    public String[] getParameters()
//    {
//        if(null == m_vectParameters)
//        {
//            return new String[0];
//        }
//        String[] ret = new String[m_vectParameters.size()];
//        for(int n = 0;n < m_vectParameters.size();n++)
//        {
//            ret[n] = m_vectParameters.get(n).getExpression();
//        }
//        return ret;
//    }
//    public String getExpression()
//    {
//        String ret=this.getFunctionName().trim();
//
//    }
}
